package org.pupil.queue;

/**
 * @Description: 队列数组实现
 * 实际刷题时更常见的写法，常数时间好
 * 如果可以确定加入操作的总次数不超过n，那么可以用
 * 一般笔试、面试都会有一个明确数据量，所以这是最常用的方式
 * @Author: pupil
 * @Date: 2024/08/04 下午 12:16
 */
public class Queue {
    private int[] queue;
    private int l; // 队头
    private int r; // 队尾

    // 加入操作总次数上限是多少，一定要知道
    public Queue(int n) {
        queue = new int[n];
        l = 0;
        r = 0;
    }

    // 判断队列是否为空
    public boolean isEmpty() {
        return l == r;
    }

    // 入队
    public void offer(int num) {
        queue[r++] = num;
    }

    // 出队
    public int poll() {
        return queue[l++];
    }

    // 获取队头
    public int head() {
        return queue[l];
    }

    public int tail() {
        return queue[r - 1];
    }

    public int size() {
        return r - l;
    }

    public static void main(String[] args) {
        Queue queue = new Queue(20);
        queue.offer(1);
        queue.offer(2);
        queue.offer(3);
        queue.offer(5);
        queue.offer(7);

        int head = queue.head();
        System.out.println("队头：" + head);

        int tail = queue.tail();
        System.out.println("队尾：" + tail);

        int size = queue.size();
        System.out.println("队列长度：" + size);

        System.out.println("队列遍历结果：");
        while (!queue.isEmpty()){
            int num = queue.poll();
            System.out.println(num);
        }

    }
}


